home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / Python 1.3.3 / Python 133 SRC / Mac / Modules / te / tesupport.py < prev   
Text File  |  1996-04-15  |  5KB  |  155 lines

  1. # This script generates a Python interface for an Apple Macintosh Manager.
  2. # It uses the "bgen" package to generate C code.
  3. # The function specifications are generated by scanning the mamager's header file,
  4. # using the "scantools" package (customized for this particular manager).
  5.  
  6. import string
  7.  
  8. # Declarations that change for each manager
  9. MACHEADERFILE = 'TextEdit.h'        # The Apple header file
  10. MODNAME = 'TE'                # The name of the module
  11. OBJECTNAME = 'TE'            # The basic name of the objects used here
  12. KIND = 'Handle'                # Usually 'Ptr' or 'Handle'
  13.  
  14. # The following is *usually* unchanged but may still require tuning
  15. MODPREFIX = MODNAME            # The prefix for module-wide routines
  16. OBJECTTYPE = "TEHandle"        # The C type used to represent them
  17. OBJECTPREFIX = MODPREFIX + 'Obj'    # The prefix for object methods
  18. INPUTFILE = string.lower(MODPREFIX) + 'gen.py' # The file generated by the scanner
  19. OUTPUTFILE = MODNAME + "module.c"    # The file generated by this program
  20.  
  21. from macsupport import *
  22.  
  23. # Create the type objects
  24. TEHandle = OpaqueByValueType("TEHandle", "TEObj")
  25. CharsHandle = OpaqueByValueType("CharsHandle", "ResObj")
  26. ##Handle = OpaqueByValueType("Handle", "ResObj")
  27. StScrpHandle = OpaqueByValueType("StScrpHandle", "ResObj")
  28. TEStyleHandle = OpaqueByValueType("TEStyleHandle", "ResObj")
  29. RgnHandle = OpaqueByValueType("RgnHandle", "ResObj")
  30.  
  31. TextStyle = OpaqueType("TextStyle", "TextStyle")
  32. TextStyle_ptr = TextStyle
  33.  
  34. includestuff = includestuff + """
  35. #include <%s>""" % MACHEADERFILE + """
  36.  
  37. /* Exported by Qdmodule.c: */
  38. extern PyObject *QdRGB_New(RGBColor *);
  39. extern int QdRGB_Convert(PyObject *, RGBColor *);
  40.  
  41. /*
  42. ** Parse/generate TextStyle records
  43. */
  44. PyObject *TextStyle_New(itself)
  45.     TextStylePtr itself;
  46. {
  47.  
  48.     return Py_BuildValue("lllO&", (long)itself->tsFont, (long)itself->tsFace, (long)itself->tsSize, QdRGB_New,
  49.                 &itself->tsColor);
  50. }
  51.  
  52. TextStyle_Convert(v, p_itself)
  53.     PyObject *v;
  54.     TextStylePtr p_itself;
  55. {
  56.     long font, face, size;
  57.     
  58.     if( !PyArg_ParseTuple(v, "lllO&", &font, &face, &size, QdRGB_Convert, &p_itself->tsColor) )
  59.         return 0;
  60.     p_itself->tsFont = (short)font;
  61.     p_itself->tsFace = (Style)face;
  62.     p_itself->tsSize = (short)size;
  63.     return 1;
  64. }
  65. """
  66.  
  67. class TEMethodGenerator(OSErrMethodGenerator):
  68.     """Similar to MethodGenerator, but has self as last argument"""
  69.  
  70.     def parseArgumentList(self, args):
  71.         args, a0 = args[:-1], args[-1]
  72.         t0, n0, m0 = a0
  73.         if m0 != InMode:
  74.             raise ValueError, "method's 'self' must be 'InMode'"
  75.         self.itself = Variable(t0, "_self->ob_itself", SelfMode)
  76.         FunctionGenerator.parseArgumentList(self, args)
  77.         self.argumentList.append(self.itself)
  78.  
  79.  
  80.  
  81. class MyObjectDefinition(GlobalObjectDefinition):
  82.     def outputCheckNewArg(self):
  83.         Output("""if (itself == NULL) {
  84.                     PyErr_SetString(TE_Error,"Cannot create null TE");
  85.                     return NULL;
  86.                 }""")
  87.     def outputFreeIt(self, itselfname):
  88.         Output("TEDispose(%s);", itselfname)
  89.         
  90.     def outputGetattrHook(self):
  91.         Output("""
  92.             if( strcmp(name, "destRect") == 0 )
  93.                 return Py_BuildValue("O&", PyMac_BuildRect,
  94.                         &(*self->ob_itself)->destRect);
  95.             if( strcmp(name, "viewRect") == 0 )
  96.                 return Py_BuildValue("O&", PyMac_BuildRect,
  97.                         &(*self->ob_itself)->viewRect);
  98.             if( strcmp(name, "selRect") == 0 )
  99.                 return Py_BuildValue("O&", PyMac_BuildRect,
  100.                         &(*self->ob_itself)->selRect);
  101.             if( strcmp(name, "lineHeight") == 0 )
  102.                 return Py_BuildValue("h", (*self->ob_itself)->lineHeight);
  103.             if( strcmp(name, "fontAscent") == 0 )
  104.                 return Py_BuildValue("h", (*self->ob_itself)->fontAscent);
  105.             if( strcmp(name, "selPoint") == 0 )
  106.                 return Py_BuildValue("O&", PyMac_BuildPoint,
  107.                         &(*self->ob_itself)->selPoint);
  108.             if( strcmp(name, "selStart") == 0 )
  109.                 return Py_BuildValue("h", (*self->ob_itself)->selStart);
  110.             if( strcmp(name, "selEnd") == 0 )
  111.                 return Py_BuildValue("h", (*self->ob_itself)->selEnd);
  112.             if( strcmp(name, "active") == 0 )
  113.                 return Py_BuildValue("h", (*self->ob_itself)->active);
  114.             if( strcmp(name, "just") == 0 )
  115.                 return Py_BuildValue("h", (*self->ob_itself)->just);
  116.             if( strcmp(name, "teLength") == 0 )
  117.                 return Py_BuildValue("h", (*self->ob_itself)->teLength);
  118.             if( strcmp(name, "txFont") == 0 )
  119.                 return Py_BuildValue("h", (*self->ob_itself)->txFont);
  120.             if( strcmp(name, "txFace") == 0 )
  121.                 return Py_BuildValue("h", (*self->ob_itself)->txFace);
  122.             if( strcmp(name, "txMode") == 0 )
  123.                 return Py_BuildValue("h", (*self->ob_itself)->txMode);
  124.             if( strcmp(name, "txSize") == 0 )
  125.                 return Py_BuildValue("h", (*self->ob_itself)->txSize);
  126.             if( strcmp(name, "nLines") == 0 )
  127.                 return Py_BuildValue("h", (*self->ob_itself)->nLines);
  128.         """)
  129.  
  130. # From here on it's basically all boiler plate...
  131.  
  132. # Create the generator groups and link them
  133. module = MacModule(MODNAME, MODPREFIX, includestuff, finalstuff, initstuff)
  134. object = MyObjectDefinition(OBJECTNAME, OBJECTPREFIX, OBJECTTYPE)
  135. module.addobject(object)
  136.  
  137. # Create the generator classes used to populate the lists
  138. Function = OSErrFunctionGenerator
  139. Method = TEMethodGenerator
  140.  
  141. # Create and populate the lists
  142. functions = []
  143. methods = []
  144. execfile(INPUTFILE)
  145.  
  146. # add the populated lists to the generator groups
  147. # (in a different wordl the scan program would generate this)
  148. for f in functions: module.add(f)
  149. for f in methods: object.add(f)
  150.  
  151. # generate output (open the output file as late as possible)
  152. SetOutputFileName(OUTPUTFILE)
  153. module.generate()
  154.  
  155.